// Ansible Inventory 语言定义和智能提示
import * as monaco from 'monaco-editor'

// 全局变量来跟踪注册状态
let inventoryLanguageRegistered = false
let inventoryCompletionProvider = null

// 注册Ansible Inventory语言
export const registerAnsibleInventoryLanguage = () => {
  // 避免重复注册
  if (inventoryLanguageRegistered) {
    console.log('Ansible Inventory语言已注册，跳过重复注册')
    return
  }

  try {
    // 注册语言
    monaco.languages.register({ id: 'ansible-inventory' })
    console.log('注册Ansible Inventory语言成功')

    // 设置语法高亮
    monaco.languages.setMonarchTokensProvider('ansible-inventory', {
      tokenizer: {
        root: [
          // 注释 - 优先级最高
          [/#.*$/, 'comment'],

          // 组名 [groupname] 或 [groupname:vars] 或 [groupname:children]
          [/^\s*\[[^\]]+\]\s*$/, 'keyword'],

          // ansible_* 参数 - 必须在变量之前
          [/\bansible_[a-zA-Z_][a-zA-Z0-9_]*/, 'variable.predefined'],

          // IP地址 - 在数字之前匹配
          [/\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b/, 'number'],

          // 主机名（行首的非空白字符开始，直到空格或=）
          [/^[a-zA-Z0-9\-_.]+(?=\s|=|$)/, 'entity.name.function'],

          // 变量赋值的等号
          [/=/, 'operator'],

          // 字符串值（等号后的内容，不包含注释）
          [/=\s*[^#\s][^#]*/, 'string'],

          // 端口号（冒号后的数字）
          [/:\d+/, 'number'],

          // 纯数字
          [/\b\d+\b/, 'number'],

          // 布尔值
          [/\b(yes|no|true|false|on|off)\b/, 'constant.language'],

          // 路径
          [/\/[^\s#]*/, 'string.regexp'],

          // 变量名
          [/\b[a-zA-Z_][a-zA-Z0-9_]*/, 'variable'],

          // 其他字符
          [/./, 'text']
        ]
      }
    })

    // 设置自定义主题 - 使用更强的颜色优先级
    monaco.editor.defineTheme('ansible-dark', {
      base: 'vs-dark',
      inherit: false,
      rules: [
        // 注释 - 绿色斜体
        { token: 'comment', foreground: '6A9955', fontStyle: 'italic' },
        { token: 'comment.line', foreground: '6A9955', fontStyle: 'italic' },

        // 组名 - 亮蓝色粗体
        { token: 'keyword', foreground: '00D7FF', fontStyle: 'bold' },
        { token: 'keyword.control', foreground: '00D7FF', fontStyle: 'bold' },

        // ansible参数 - 亮绿色粗体
        { token: 'variable.predefined', foreground: '4FC1FF', fontStyle: 'bold' },
        { token: 'support.variable', foreground: '4FC1FF', fontStyle: 'bold' },

        // 主机名 - 黄色
        { token: 'entity.name.function', foreground: 'FFD700' },
        { token: 'entity.name', foreground: 'FFD700' },

        // 操作符 - 白色
        { token: 'operator', foreground: 'FFFFFF' },
        { token: 'punctuation', foreground: 'FFFFFF' },

        // 字符串值 - 橙色
        { token: 'string', foreground: 'FFA500' },
        { token: 'string.value', foreground: 'FFA500' },

        // IP地址和数字 - 亮绿色
        { token: 'number', foreground: '00FF7F' },
        { token: 'constant.numeric', foreground: '00FF7F' },

        // 普通变量 - 浅蓝色
        { token: 'variable', foreground: '87CEEB' },
        { token: 'variable.other', foreground: '87CEEB' },

        // 布尔值 - 紫色
        { token: 'constant.language', foreground: 'DA70D6', fontStyle: 'bold' },

        // 路径 - 青色
        { token: 'string.regexp', foreground: '40E0D0' },

        // 普通文本
        { token: 'text', foreground: 'D4D4D4' },

        // 默认文本
        { token: '', foreground: 'D4D4D4' }
      ],
      colors: {
        'editor.background': '#1E1E1E',
        'editor.foreground': '#D4D4D4',
        'editor.lineHighlightBackground': '#2D2D30',
        'editor.selectionBackground': '#264F78',
        'editorCursor.foreground': '#AEAFAD',
        'editorWhitespace.foreground': '#404040'
      }
    })

    // 注册智能提示提供者
    inventoryCompletionProvider = monaco.languages.registerCompletionItemProvider('ansible-inventory', {
      provideCompletionItems: (model, position) => {
        const word = model.getWordUntilPosition(position)
        const range = {
          startLineNumber: position.lineNumber,
          endLineNumber: position.lineNumber,
          startColumn: word.startColumn,
          endColumn: word.endColumn
        }

        const suggestions = []
        const lineText = model.getLineContent(position.lineNumber)
        const linePrefix = lineText.substring(0, position.column - 1)

        // Ansible内置参数提示
        const ansibleParams = [
          { name: 'ansible_host', desc: '目标主机的IP地址或主机名' },
          { name: 'ansible_port', desc: 'SSH连接端口，默认22' },
          { name: 'ansible_user', desc: 'SSH连接用户名' },
          { name: 'ansible_password', desc: 'SSH连接密码（不推荐）' },
          { name: 'ansible_ssh_private_key_file', desc: 'SSH私钥文件路径' },
          { name: 'ansible_connection', desc: '连接类型：ssh, local, docker等' },
          { name: 'ansible_become', desc: '是否提权：yes/no' },
          { name: 'ansible_become_user', desc: '提权到的用户，默认root' },
          { name: 'ansible_become_method', desc: '提权方法：sudo, su, pbrun等' },
          { name: 'ansible_python_interpreter', desc: 'Python解释器路径' }
        ]

        // 如果不在组名行和注释行，提供ansible参数提示
        if (!linePrefix.trim().startsWith('[') && !linePrefix.trim().startsWith('#')) {
          ansibleParams.forEach(param => {
            suggestions.push({
              label: param.name,
              kind: monaco.languages.CompletionItemKind.Property,
              insertText: param.name + '=',
              documentation: param.desc,
              detail: 'Ansible参数',
              range: range
            })
          })
        }

        // 常用组名提示（在[]内）
        if (linePrefix.includes('[') && !linePrefix.includes(']')) {
          const commonGroups = [
            // 服务类型组
            { name: 'webservers', desc: 'Web服务器组 - Nginx, Apache等' },
            { name: 'appservers', desc: '应用服务器组 - Tomcat, Node.js等' },
            { name: 'databases', desc: '数据库服务器组 - MySQL, PostgreSQL等' },
            { name: 'redis', desc: 'Redis缓存服务器组' },
            { name: 'mongodb', desc: 'MongoDB数据库服务器组' },
            { name: 'elasticsearch', desc: 'Elasticsearch搜索服务器组' },
            { name: 'loadbalancers', desc: '负载均衡器组 - HAProxy, Nginx等' },
            { name: 'monitoring', desc: '监控服务器组 - Zabbix, Prometheus等' },
            { name: 'logging', desc: '日志服务器组 - ELK Stack等' },
            { name: 'backup', desc: '备份服务器组' },
            { name: 'storage', desc: '存储服务器组 - NFS, Ceph等' },
            { name: 'proxy', desc: '代理服务器组' },
            { name: 'gateway', desc: '网关服务器组' },
            { name: 'mq', desc: '消息队列服务器组 - RabbitMQ, Kafka等' },
            { name: 'jenkins', desc: 'Jenkins CI/CD服务器组' },
            { name: 'docker', desc: 'Docker容器主机组' },
            { name: 'kubernetes', desc: 'Kubernetes集群节点组' },

            // 环境组
            { name: 'production', desc: '生产环境' },
            { name: 'prod', desc: '生产环境（简写）' },
            { name: 'staging', desc: '预发布环境' },
            { name: 'stage', desc: '预发布环境（简写）' },
            { name: 'testing', desc: '测试环境' },
            { name: 'test', desc: '测试环境（简写）' },
            { name: 'development', desc: '开发环境' },
            { name: 'dev', desc: '开发环境（简写）' },
            { name: 'sandbox', desc: '沙箱环境' },
            { name: 'demo', desc: '演示环境' },
            { name: 'uat', desc: '用户验收测试环境' },
            { name: 'sit', desc: '系统集成测试环境' },

            // 地理位置组
            { name: 'beijing', desc: '北京机房' },
            { name: 'shanghai', desc: '上海机房' },
            { name: 'guangzhou', desc: '广州机房' },
            { name: 'shenzhen', desc: '深圳机房' },
            { name: 'hangzhou', desc: '杭州机房' },
            { name: 'chengdu', desc: '成都机房' },
            { name: 'aws', desc: 'AWS云服务器' },
            { name: 'aliyun', desc: '阿里云服务器' },
            { name: 'tencent', desc: '腾讯云服务器' },
            { name: 'huawei', desc: '华为云服务器' },

            // 功能组
            { name: 'frontend', desc: '前端服务器组' },
            { name: 'backend', desc: '后端服务器组' },
            { name: 'api', desc: 'API服务器组' },
            { name: 'admin', desc: '管理后台服务器组' },
            { name: 'cdn', desc: 'CDN节点组' },
            { name: 'mail', desc: '邮件服务器组' },
            { name: 'ftp', desc: 'FTP服务器组' },
            { name: 'dns', desc: 'DNS服务器组' },
            { name: 'ntp', desc: 'NTP时间服务器组' },
            { name: 'bastion', desc: '堡垒机组' },
            { name: 'jumpserver', desc: '跳板机组' },

            // 特殊组
            { name: 'all', desc: '所有主机' },
            { name: 'ungrouped', desc: '未分组主机' }
          ]

          commonGroups.forEach(group => {
            suggestions.push({
              label: group.name,
              kind: monaco.languages.CompletionItemKind.Module,
              insertText: group.name + ']',
              documentation: group.desc,
              detail: '主机组',
              range: range
            })
          })

          // 组变量和子组提示
          suggestions.push({
            label: ':vars',
            kind: monaco.languages.CompletionItemKind.Keyword,
            insertText: ':vars]',
            documentation: '定义组变量',
            detail: '组变量',
            range: range
          })

          suggestions.push({
            label: ':children',
            kind: monaco.languages.CompletionItemKind.Keyword,
            insertText: ':children]',
            documentation: '定义子组',
            detail: '子组',
            range: range
          })
        }

        return { suggestions: suggestions }
      }
    })

    // 标记为已注册
    inventoryLanguageRegistered = true
    console.log('Ansible Inventory语言和智能提示注册成功')
  } catch (error) {
    console.error('注册Ansible Inventory语言失败:', error)
  }
}

// 清理Ansible Inventory语言注册
export const unregisterAnsibleInventoryLanguage = () => {
  if (inventoryCompletionProvider) {
    try {
      inventoryCompletionProvider.dispose()
      inventoryCompletionProvider = null
      console.log('Ansible Inventory智能提示提供者已清理')
    } catch (error) {
      console.error('清理Ansible Inventory智能提示提供者失败:', error)
    }
  }
}

// 默认的Ansible Inventory内容
export const getDefaultAnsibleContent = () => {
  return `# Ansible Inventory 示例
# 主机组定义
[webservers]
web01 ansible_host=192.168.1.10 ansible_user=root ansible_port=22
web02 ansible_host=192.168.1.11 ansible_user=root ansible_port=22

[databases]
db01 ansible_host=192.168.1.20 ansible_user=root ansible_port=3306

# 组变量
[webservers:vars]
http_port=80
max_clients=200
ansible_become=yes

[databases:vars]
mysql_port=3306
ansible_python_interpreter=/usr/bin/python3

# 所有主机的通用变量
[all:vars]
ansible_port=22
ansible_ssh_common_args='-o StrictHostKeyChecking=no'`
}
